7. Sintetização

1 Diretório

2 Pacotes e dados

library(rio)
library(tidyverse)
library(metan)

# set_wd_here("data")
# dados
df <- import("eucalipto.xlsx")
df_retangulo <- 
  df |> 
  mutate(col = rep(1:14, 5),
         row = rep(1:5, each = 14))

p1 <- 
  ggplot(df_retangulo, aes(x = col, y = row, z = circunferencia)) +
  geom_tile(aes(fill = circunferencia), color = "white") +
  scale_fill_viridis_c() +
  theme_minimal() +
  scale_y_reverse() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  coord_fixed(ratio = 1)
p1

3 Sintetização

Após a organização e mutação dos dados, o cientista precisa resumi-los utilizando alguma métrica de interesse. A média, a mediana, a variância, a frequência, a proporção, por exemplo, são tipos de sumarização que trazem diferentes informações sobre uma variável. No R, a função summarise() cria um novo data frame. Ele terá uma (ou mais) linhas para cada combinação de variáveis de agrupamento; se não houver variáveis de agrupamento, a saída terá uma única linha resumindo todas as observações na entrada. Ele conterá uma coluna para cada variável de agrupamento e uma coluna para cada uma das estatísticas de resumo que você especificou.

Fonte: https://dplyr.tidyverse.org/index.html

3.1 Uma variável, uma estatística

Diversos verbos do pacote dplyr podem ser utilizados para resumir conjuntos de dados. Iniciaremos com a função count() para contar valores que se repetem em uma determinada variável.

df |> count(circunferencia, sort = TRUE)
   circunferencia n
1            39.0 4
2            30.1 2
3            32.3 2
4            34.0 2
5            35.0 2
6            37.0 2
7            43.8 2
8            15.4 1
9            17.5 1
10           19.0 1
11           19.2 1
12           19.3 1
13           20.5 1
14           21.5 1
15           21.7 1
16           22.0 1
17           24.5 1
18           25.2 1
19           25.3 1
20           26.3 1
21           29.1 1
22           30.0 1
23           30.5 1
24           31.0 1
25           31.2 1
26           31.5 1
27           31.7 1
28           32.0 1
29           32.6 1
30           33.2 1
31           33.4 1
32           34.4 1
33           34.8 1
34           35.1 1
35           35.5 1
36           36.2 1
37           36.4 1
38           36.7 1
39           37.2 1
40           37.3 1
41           37.8 1
42           39.3 1
43           39.5 1
44           39.6 1
45           39.8 1
46           40.0 1
47           40.5 1
48           41.0 1
49           41.1 1
50           41.5 1
51           42.0 1
52           42.4 1
53           43.3 1
54           43.5 1
55           44.1 1
56           44.2 1
57           45.7 1
58           46.5 1
59           48.0 1
60           49.2 1
61           53.3 1

Para calcular a média da variável circunferencia usamos a função summarise() é usada.

df |> summarise(media_ngra = mean(circunferencia))
  media_ngra
1   34.71286
# remover os NAs para cálculo da estatística
df |> summarise(media_ngra = mean(circunferencia, na.rm = TRUE))
  media_ngra
1   34.71286
#usando o R base
mean(df$circunferencia, na.rm = TRUE)
[1] 34.71286

3.2 Uma variável, diversas estatísticas

Utilizando a função summarise() é possível criar uma ou mais variáveis escalares resumindo as variáveis de um data frame existente. Como resultado, uma linha e várias colunas é retornada. O seguinte código calcula a média global e o desvio padrão amostral da variável MGRA eretorna o n utilizado na estimativa.

df |>  
  summarise(
    media = mean(circunferencia),
    dp = sd(circunferencia),
    n = n()
  )
     media       dp  n
1 34.71286 8.200476 70

Muitas vezes é necessário computar uma determinada função (como a média) para cada nível de uma variável categórica. Continuamos no mesmo exemplo anterior, mas agora neste caso, o objetivo é calcular a média da MGRA para cada híbrido. Utilizando a função group_by() antes da função summarise() uma linha de resultado para cada nível do fator híbrido é retornado.

df |>
  group_by(fila) %>%
  summarise(
    media = mean(circunferencia),
    max = max(circunferencia),
    min = min(circunferencia)
  )
# A tibble: 5 × 4
  fila  media   max   min
  <chr> <dbl> <dbl> <dbl>
1 F1     38.5  53.3  31.5
2 F2     38.7  46.5  25.2
3 F3     37.5  49.2  25.3
4 F4     33.9  44.1  24.5
5 F5     24.9  39.5  15.4

3.3 Diversas variáveis, uma estatística

Até aqui vimos como a média (global ou para cada híbrido) da MGRA pode ser calculada. Quase sempre, no entanto, quando calculamos a média (ou qualquer outra medida) em um conjunto de dados, queremos fazê-la para todas (ou algumas) variáveis numéricas dos dados. Implementar isto com dplyr é relativamente fácil. Para isto, é utilizada a função across() que aplica uma função (ou um conjunto de funções) a um conjunto de colunas. Veremos como across() pode ser utilizada para calcular a média para as variáveis numéricas do conjunto df. No exemplo abaixo, where() aplica uma função (neste caso is.numeric()) a todas as variáveis e seleciona aquelas para as quais a função retorna TRUE. Assim, a média somente é calculada para as variáveis numéricas.

df |> 
  summarise(across(dap_suta:circunferencia, \(x){mean(x, na.rm = TRUE)})) 
  dap_suta dap_trena circunferencia
1 10.84143  11.19429       34.71286

Funções próprias podem ser aplicadas dentro da função summarise() para computar uma estatística personalizada. Como exemplo, vamos criar uma função chamada se que retornará o erro padrão da média e aplicá-la a todas as variáveis que iniciam "M", para cada nível do fator AMB.

se <- function(dados){
  sd(dados, na.rm = TRUE) / sqrt(length(na.omit(dados)))
}

df |>
  group_by(fila) %>%
  summarise(across(dap_suta:circunferencia,
                   .fns = se,
                   .names = "{.col}.se"))
# A tibble: 5 × 4
  fila  dap_suta.se dap_trena.se circunferencia.se
  <chr>       <dbl>        <dbl>             <dbl>
1 F1          0.602        0.689              1.72
2 F2          0.495        0.606              1.45
3 F3          0.538        0.549              1.70
4 F4          0.529        0.562              1.62
5 F5          0.638        0.653              2.13

3.4 Diversas variáveis, diversas estatísticas

Se desejamos computar mais de uma estatística para variáveis específicas, então o próximo código nos ajudará. Note que para aplicar mais de uma função é necessário criar uma lista com o nome das funções. Neste caso, os sufixos _m e _sd representam a média e o desvio padrão, respectivamente. Faremos isso para cada nível da variável fila.

df %>%
  group_by(fila) |> 
  summarise(across(dap_suta:circunferencia,
                   .fns =  list(m = mean, sd = sd)))
# A tibble: 5 × 7
  fila  dap_suta_m dap_suta_sd dap_trena_m dap_trena_sd circunferencia_m
  <chr>      <dbl>       <dbl>       <dbl>        <dbl>            <dbl>
1 F1         12.1         2.25       12.8          2.58             38.5
2 F2         12.1         1.85       12.4          2.27             38.7
3 F3         11.8         2.01       11.8          2.05             37.5
4 F4         10.5         1.98       10.9          2.10             33.9
5 F5          7.64        2.39        8.19         2.44             24.9
# ℹ 1 more variable: circunferencia_sd <dbl>

3.5 Quick tips

my_quantile <- function(x, probs) {
  tibble::tibble(x = quantile(x, probs), probs = probs)
}

df %>%
  group_by(fila) %>%
  reframe(my_quantile(circunferencia, c(0.25, 0.75)))
# A tibble: 10 × 3
   fila      x probs
   <chr> <dbl> <dbl>
 1 F1     33.6  0.25
 2 F1     41.2  0.75
 3 F2     35.5  0.25
 4 F2     41.1  0.75
 5 F3     32.8  0.25
 6 F3     42.2  0.75
 7 F4     30.0  0.25
 8 F4     37.0  0.75
 9 F5     19.2  0.25
10 F5     30.9  0.75